
package TokensDelLenguaje;

import PolacaInversa.Registro;
import java.util.ArrayList;

public class Token_Cmp extends Token_Operador{
    
    public Token_Cmp(){
        super(Tokens.cmp);
    }
    @Override
    public String toString(){
        return (super.toString());
    }
    
    // Falta el informe de errores, que iría en el último else
    public ArrayList conversionImplicita(Token o1, Token o2, Registro reg) {
        ArrayList list = new ArrayList();
        String s = "";
        Tokens op1 = o1.getId();
        Tokens op2 = o2.getId();

        //La logica de la tabla de conversion para este operador
        if (op1 == Tokens.const_uinteger && op2 == Tokens.const_uinteger) {
            if(!reg.nombre.equals(o2.getNombre())){
                s += "MOV " + reg.nombre + ", " + o2.getNombre() + "\n";
                s += "CMP " + reg.nombre + ", " + o1.getNombre() + "\n";
            }
            else{
                s += "CMP " + reg.nombre + ", " + o1.getNombre() + "\n";
            }
            list.add(s);
        }
            else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_ulongint) {
                if(!reg.nombre.equals(o2.getNombre())){
                    s += "MOV " + reg.nombre + ", " + o2.getNombre() + "\n";
                    s += "CMP " + reg.nombre + ", " + o1.getNombre() + "\n";
                }
                else{
                    s += "MOV " + reg.nombre + ", " + o2.getNombre() + "\n";
                    s += "CMP " + reg.nombre + ", " + o1.getNombre() + "\n";
                }
                list.add(s);
            }
                else if (op1 == Tokens.const_uinteger && op2 == Tokens.const_ulongint) {
                    if(!o2.esRegistro()){
                        s = conversion(o1,reg);
                        s += "MOV eax, " + o2.getNombre() + "\n";
                        s += "CMP eax, " + reg.nombre + "\n";
                        list.add(s);
                    }
                    else{
                        s = conversion(o1,new Registro("eax", 4));
                        s += "CMP " + o2.getNombre() + ", eax\n";
                        list.add(s);
                    }
                }
                    else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_uinteger) {
                        //Generar Assembler.
                            s = conversion(o2,reg);
                            s += "CMP " + reg.nombre + ", " + o1.getNombre() + "\n";
                            list.add(s);
                    }
        list.add(0, true);
        return list;
    }
    
    public ArrayList traducir_assembler(Token o1, Token o2, Registro reg){
        
        ArrayList list = super.traducir_assembler(o1, o2, reg);
        ArrayList l = new ArrayList();
        String s = (String) list.get(1);
        
        l.add(list.get(0));
        l.add(s);
        return l;
    }
}
